﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Demo2
/*    一、编写一个控制台应用程序，接受用户输入的两个整数和一个操作符，以实现对两个整数的加、减、乘、除运算，并显示出计算结果。

1、创建Calculate积累，其中包含两个整型的protected成员，用以接收用户输入的两个整数。定义一个DisplayResult()虚方法，计算并输出结果。
2、定义四个类继承自Calculate类，分别重写DisplayResult()方法，实现两个整数的加、减、乘、除运算，并输出结果。
3、根据用户输入的操作符，实例化相应的类，完成运算并输出结果。
4、在主类中添加一个方法，形参为父类对象，根据传递实参的类型，调用方法，实现计算和显示结果。*/

{
    class Program2
    {
        static void Main(string[] args)
        {
            int a;
            int b;
            string sign;
            while (true)
            {
                try
                {
                    Console.WriteLine("请输入第一个整数");
                    a = int.Parse(Console.ReadLine());
                    Console.WriteLine("请输入第二个整数");
                    b = int.Parse(Console.ReadLine());
                    break;
                }
                catch (Exception)
                {
                    Console.WriteLine("请重新输入");
                }
            }
            while (true)
            {
                Console.WriteLine("请输入加减乘除操作符之一");
                sign = Console.ReadLine();
                
                if (sign != "+" && sign != "-" && sign != "*" && sign != "/")
                {
                    Console.WriteLine("请重新输入");
                    continue;
                }
                break;
            }
            Calculate c = null;
            switch (sign)
            {
                case "+":
                    c = new AddClass(a, b);
                    break;
                case "-":
                    c = new MinusClass(a, b);
                    break;
                case "*":
                    c = new MultiplyClass(a, b);
                    break;
                case "/":
                    c = new ExceptClass(a, b);
                    break;
                default:
                    break;
            }
            Console.WriteLine("result:" + MyTest(c));
        }

        static int MyTest(Calculate c)
        {
            return c.DisplayResult();
        }
    }

    class Calculate
    {
        private int a;
        private int b;

        protected int A { get => a; set => a = value; }
        protected int B { get => b; set => b = value; }

        public Calculate(int a, int b)
        {
            this.a = a;
            this.b = b;
        }

        public Calculate()
        {

        }

        public virtual int DisplayResult()
        {
            return 0;
        }
    }

    class AddClass : Calculate
    {
        public AddClass(int a,int b) : base(a,b)
        {

        }
        public override int DisplayResult()
        {
            return A + B;
        }
    }
    class MinusClass : Calculate
    {
        public MinusClass(int a, int b) : base(a, b)
        {

        }
        public override int DisplayResult()
        {
            return A - B;
        }
    }
    class MultiplyClass : Calculate
    {
        public MultiplyClass(int a, int b) : base(a, b)
        {

        }
        public override int DisplayResult()
        {
            return A * B;
        }
    }
    class ExceptClass : Calculate
    {
        public ExceptClass(int a, int b) : base(a, b)
        {

        }
        public override int DisplayResult()
        {
            return A / B;
        }
    }
}
